#include <iostream>
#include <future>
#include <thread>
#include <functional>
using namespace std;

int Add(int num1, int num2)
{
    return num1 + num2;
}
// packaged_task实例化的对象可以对函数进行二次封装
// 但是该对象不能完全代替一个函数

int main()
{
    // 同步处理
    //  packaged_task<int(int, int)> pkg(Add);
    //  future<int> fut = pkg.get_future();
    //  pkg(10,20);//可以像函数一样直接调用

    // thread t(pkg,10,20);//不能直接当作函数进行传递参数
    // async(launch::async,pkg,10,20);//不能直接当作函数进行传递参数

    // 异步处理
    auto sp = make_shared<packaged_task<int(int, int)>>(Add); // 防止局部生命周期失效
    future<int> fut = sp->get_future();
    thread t([sp]()
             { (*sp)(10, 20); });
    cout << fut.get() << endl;

    t.join();
    return 0;
}